#ifndef __HEADER_H__
#define __HEADER_H__

// 头文件
#include <stdio.h>
#include <errno.h>
#include <string.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <time.h>
#include <pwd.h>
#include <grp.h>
#include <dirent.h>
#include <sys/file.h>
#include <sys/wait.h>
#include <signal.h>
#include <pthread.h>
#include <semaphore.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/msg.h>
#include <sys/sem.h>

// 头文件 网络编程
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>

//导入
#include "tcp.h"
#include "client.h"
#include "login_reg.h"


// 常用宏定义
#define FOPEN_ERR(FP) if (NULL == FP) \
    { \
    perror("fopen error:"); \
    return 0; \
    } \

#define OPEN_DIR_ERR(DIR) if (NULL == DIR) \
    { \
    perror("fopen error:"); \
    return 0; \
    } \


#define OPEN_ERR(FD) if (NULL == FD) \
    { \
    perror("open error:"); \
    return 0; \
    } \

// 错误输出宏定义，写入日志文件并显示在终端
#define ERRLOG(msg) do {     time_t now = time(NULL);     char *timestr = ctime(&now);     timestr[strlen(timestr) - 1] = '\0'; /* 去掉末尾的换行符 */     FILE *log_file = fopen(LOG_FILE, "a");     if (log_file) {         fprintf(log_file, "[%s] 错误: %s\t文件: %s\t函数: %s\t行号: %d\n\n",                 timestr, msg, __FILE__, __func__, __LINE__);         fclose(log_file);     } else {         fprintf(stderr, "错误: 无法打开日志文件: %s\n", LOG_FILE);     }     /* 输出到标准错误流 */     fprintf(stderr, "[%s] 错误: %s\t文件: %s\t函数: %s\t行号: %d\n",             timestr, msg, __FILE__, __func__, __LINE__); } while (0)

#endif 



